package db;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * Фабрика соединений с БД.
 */
public class ConnectionFactory {
    /**
     * Константные значения параметров по умолчанию
     */
    public final static String DATABASE = "DATABASE";
    public final static String DATABASENAME = "DATABASENAME";
    public final static String ENCODING = "ENCODING";
    public final static String LOGIN_TIMEOUT = "LOGIN_TIMEOUT";
    public final static String USER_NAME = "USER_NAME";
    public final static String PASSWORD = "PASSWORD";
    private static MysqlDataSource dataSource;
    private static ConnectionFactory instance = new ConnectionFactory();
    private final Properties properties;

    /**
     * Вместо явного вызова конструктора следует использовать
     * <code>ConnectionFactory.getInstance()</code>
     */
    private ConnectionFactory() {
        // Создаем свойства по умолчанию
        final Properties defaultProperties = new Properties();
        defaultProperties.setProperty(DATABASE, "localhost");
        defaultProperties.setProperty(DATABASENAME, "farma_loc");
        defaultProperties.setProperty(USER_NAME, "SYSDBA");
        defaultProperties.setProperty(PASSWORD, "masterkey");
        defaultProperties.setProperty(ENCODING, "UTF8");
        defaultProperties.setProperty(LOGIN_TIMEOUT, "10");
        // Создаем свойства с установленными свойствами по умолчанию
        properties = new Properties(defaultProperties);
    }

    public static ConnectionFactory getInstance() {
        return instance;
    }

    public void loadConfigFromXML(InputStream in) throws IOException {
        properties.loadFromXML(in);
    }

    /**
     * Получить соединение с базой данных.
     * При первом обращении создается объект соединения.
     * При последующих обращениях он повторно используется.
     *
     * @return соединение
     */
    public Connection getConnection() throws SQLException {
        if (dataSource == null) {
            // Создаем источник данных
            dataSource = new MysqlDataSource();
            //Устанавливаем свойства
            dataSource.setUser(properties.getProperty(USER_NAME));
            dataSource.setPassword(properties.getProperty(PASSWORD));
            dataSource.setCharacterEncoding(properties.getProperty(ENCODING));
            dataSource.setServerName(properties.getProperty(DATABASE));
            dataSource.setDatabaseName(properties.getProperty(DATABASENAME));
            dataSource.setLoginTimeout(Integer.valueOf(properties.getProperty(LOGIN_TIMEOUT)));
        }
        return dataSource.getConnection();
    }

}
